package com.lnu.information.util;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

import static com.lnu.information.variable.StaticVariable.*;



/**
 * @author : jian.zhang-2
 * @description: pdf转文本测试
 * /Users/zhangjian/Downloads/溢多利：关于控股股东部分股份质押的公告.PDF
 * /Users/zhangjian/Downloads/万泽股份：万泽股份关于5%以上股东减持股份比例达到1%的公告.PDF
 * @date : Create in 6:39 PM 2021/6/22
 * @modified By :
 */
public class SpirePdfUtil {

    /***
     * 批量把pdf转成txt
     * @param requestDTO 请求对象，里面是带有路径的文件名的集合
     * @return 响应对象
     */
//    public ResponseDTO batchPdf2txt(RequestDTO requestDTO){
//        String filePath = requestDTO.getFilePath();
//        ResponseDTO responseDTO = new ResponseDTO();
//        try {
//            //遍历文件中的所有文件夹，提取出文件来操作
//            BufferedWriter writer = new BufferedWriter (new OutputStreamWriter(new FileOutputStream (requestDTO.getTargetFileName(),true),UTF8));
//            List<String> fileNameList = new ArrayList<String>();
//            folderMethod(filePath, fileNameList);
//            for(int i = 0; i < fileNameList.size(); i++){
//                pdf2Txt(fileNameList.get(i), writer);
//            }
//            writer.close();
//        }catch (Exception e){
//            e.printStackTrace();
//            responseDTO.setCode(CodeVariable.FAIL);
//            responseDTO.setMessage(e.getMessage());
//            return responseDTO;
//        }finally {
//            responseDTO.setCode(CodeVariable.SUCCESS);
//            responseDTO.setMessage(StaticVariable.SUCCESS);
//        }
//        return responseDTO;
//    }
//
//    /***
//     * 将pdf转入txt文件中，如果文件已经有内容，则换行继续填充
//     * @param pdfFileName 文件名
//     * @param writer 写入流
//     * @return 无
//     */
//    private void pdf2Txt(String pdfFileName, BufferedWriter writer){
//        //创建PdfDocument实例
//        PdfDocument doc = new PdfDocument();
//        //加载PDF文件
//        doc.loadFromFile(pdfFileName);
//        //带输出的文本流
//        String txtContent = EMPTY;
//        String imageContent = EMPTY;
//        //index为图片的编号
//        try {
//            PdfPageCollection pages = doc.getPages();
//            for(int i= 0;i<pages.getCount();i++){
//                //处理pdf中的文本
//                String content = pdf2Txt(pages, i);
//                txtContent += content;
//                //如果没有内容，则说明整页都是图片
//                if(EMPTY.equals(content)) {
//                    //处理pdf中的图片
//                    List<String> imageList = pdf2Image(pdfFileName, pages.get(i));
//                    //进行图片的文字识别
//                    imageContent += image2Txt(imageList);
//                }
//            }
//            String content = txtContent + imageContent;
//            //有效输出流才会去写入文件
//            if(!EMPTY.equals(content)) {
//                writer.write(content + LINE_BREAK);
//                writer.flush();
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (Exception e){
//            e.getStackTrace();
//        }
//        finally {
//            doc.close();
//        }
//    }
//
//    /***
//     * pdf直接转换成文本
//     * @param pages 文本按页分开后，页的集合
//     * @param i 页号
//     * @return
//     */
//    private String pdf2Txt(PdfPageCollection pages, int i) {
//        String content = EMPTY;
//        content += pages.get(i).extractText(true);
//        //将输出流中的空格、换行、回车符去掉
//        content = content.replaceAll(BLANK , EMPTY).replaceAll(LINE_BREAK , EMPTY).replaceAll(ENTER_BREAK, EMPTY);
//        return content;
//    }
//
//    /***
//     * 将pdf的一页转化成图片
//     * @param pdfFileName pdf文件名
//     * @param page 待操作的页
//     * @return 图片文件名的集合
//     */
//    private List<String> pdf2Image(String pdfFileName , PdfPageBase page){
//        //使用extractImages方法获取指定页上图片
//        BufferedImage[] images = page.extractImages();
//        List<String> imageNameList = new ArrayList<String>();
//        int index = 0;
//        try {
//            for(int i = 0; i < images.length; i++){
//                BufferedImage image = images[i];
//                //指定输出文件路径及名称
//                String imageName = pdfFileName.split(POINT)[0]+ String.format(IMAGE_NAME, index++);
//                imageNameList.add(imageName);
//                File output = new File(imageName);
//                //将图片保存为PNG格式文件
//                ImageIO.write(image, PNG, output);
//            }
//        }catch (IOException e){
//            e.printStackTrace();
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        return imageNameList;
//    }

    /***
     * 将图片中的文本读取出来
     * @param imageList 图片列表，按顺序读
     * @return 文本流的字符串
     */
    public String image2Txt(List<String> imageList) {
        String result = "";
        for(int i = 0; i < imageList.size(); i++){
            String imageName = imageList.get(i);
            if(imageName.endsWith("png")) {
                File file = new File(imageName);
                ITesseract it = new Tesseract();
                it.setLanguage("chi_sim");
                it.setDatapath("/Users/zhangjian/tessdata");
                try {
                    String resultImage = it.doOCR(file).replaceAll(BLANK, EMPTY).replaceAll(LINE_BREAK, EMPTY).replaceAll(ENTER_BREAK, EMPTY);
                    System.out.println("识别结果:" + resultImage);
                    result += resultImage + "\n";
                } catch (TesseractException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return EMPTY;
                } catch (Exception e) {
                    e.printStackTrace();
                    return EMPTY;
                }
            }
        }
        return result;
    }

    /***
     * 将图片中的文本读取出来
     * @param file
     * @return 文本流的字符串
     */
    public String image2Txt(File file) {
        String result = "";
        try {
            String fileName = file.getName();
            if("jpg".equals(fileName.substring(fileName.lastIndexOf(".")+1)) || "png".equals(fileName.substring(fileName.lastIndexOf(".")+1))) {
                ITesseract it = new Tesseract();
                it.setLanguage("chi_sim");
                it.setDatapath("/Users/zhangjian/tessdata");
                String resultImage = it.doOCR(file).replaceAll(BLANK, EMPTY).replaceAll(LINE_BREAK, EMPTY).replaceAll(ENTER_BREAK, EMPTY);
                System.out.println("识别结果:" + resultImage);
                result += resultImage + "\n";
            }
        } catch (TesseractException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return EMPTY;
        } catch (Exception e) {
            e.printStackTrace();
            return EMPTY;
        }
        return result;
    }




    /***
     * 获取文件夹里面的所有文件
     * @param path
     * @param fileNameList
     */
    public static void folderMethod(String path, List<String> fileNameList) {
        File file = new File(path);
        if (file.exists()) {
            //获取当前路径下的所有文件
            File[] files = file.listFiles();
            if (null != files) {
                //遍历
                for (File file2 : files) {
                    //获取当前文件名
                    String fileName = file2.getAbsolutePath();
                    //如果是文件夹，则递归处理
                    if (file2.isDirectory()) {
                        folderMethod(fileName,fileNameList);
                    }
                    //否则将该文件放入集合保存
                    else {
                        //macos系统下默认的隐藏文件
                        if(!fileName.contains(".DS_Store")) {
                            fileNameList.add(fileName);
                        }
                    }
                }
            }
        } else {
            System.out.println("文件不存在!");
        }
    }

    /***
     * 图片转文本
     * @param filePath
     */
    public void image2Txt(String filePath) {
        //获取输入路径下的所有文件
        List<String> fileNameList = new ArrayList<String>();
        SpirePdfUtil.folderMethod(filePath, fileNameList);
        //正式进行图片转写
        String result = image2Txt(fileNameList);
        try {
            BufferedWriter writer = new BufferedWriter (new OutputStreamWriter(new FileOutputStream (filePath + "a.txt",true),UTF8));
            //有效输出流才会去写入文件
            if(!EMPTY.equals(result)) {
                writer.write(result + LINE_BREAK);
                writer.flush();
            }
            writer.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
